package com.gitee.chili.leisure.game;

import com.gitee.chili.leisure.enums.State;
import lombok.Data;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * Player
 *
 * @author week solider
 * @since 2020-07-06
 */

@Data
@Accessors(chain = true)
public abstract class Player {

    /**
     * 对应的用户ID
     */
    protected Long userId;

    /**
     * 用户昵称
     */
    protected String nickname;

    /**
     * 性别
     */
    protected int gender;

    /**
     * IP地址
     */
    protected String ip;

    /**
     * 头像
     */
    protected String portrait;

    /**
     * 玩家手牌
     */
    protected List<Integer> handsCards = new ArrayList<>();

    /**
     * 是否庄家  (1:是 0:否)
     */
    protected boolean banker;

    /**
     * 出牌记录
     */
    protected List<Integer> discard = new ArrayList<>();

    /**
     * 玩家的位置
     */
    protected int position;

    /**
     * 发到地主牌的玩家 (1:是 0:否)
     */
    protected boolean select;

    /**
     * 0:未准备、1:准备中、2:游戏中、3:破产
     */
    protected State status;

    /**
     * 是否在线 (1:是 0:否)
     */
    protected Boolean online;

    /**
     * 金币 (游戏币)
     */
    protected BigDecimal score;

    /**
     * 当前所在的房间号
     */
    protected Long roomNum;

    /**
     * 游戏类型
     */
    protected Long gameType;

    /**
     * 添加手牌
     */
    public void draw(Integer card) {
        draw0(card);
    }

    protected abstract void draw0(Integer card);

    /**
     * 记录出牌
     */
    public void discard(Integer card) {
        discard0(card);
    }

    protected abstract void discard0(Integer card);

    /**
     * 要注意，在服务启动时，通过这里获取指定的类型，所以类型一定要与数据库保持高度一致，不然可能造成无法预测的结果
     * 隶属于那个游戏类型下的实例
     */
    public abstract Long getType();

    /**
     * 减去分数
     */
    public void subScore(Number number) {
        if (number instanceof BigDecimal) {
            BigDecimal decimal = (BigDecimal) number;
            score = score.subtract(decimal);
            return;
        }
        score = score.subtract(new BigDecimal(String.valueOf(number)));
    }

    /**
     * 增加分数
     */
    public void addScore(Number number) {
        if (number instanceof BigDecimal) {
            BigDecimal decimal = (BigDecimal) number;
            score = score.add(decimal);
            return;
        }
        score = score.add(new BigDecimal(String.valueOf(number)));
    }

    /**
     * 是否还有资产继续
     */
    public boolean isCapable() {
        return score.compareTo(new BigDecimal("0")) > 0;
    }

}
